﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace _4mvcBlog.Core
{
    /// <summary>
    /// 标识Action是否由AJAX访问.
    /// 如果一个Action方法标识为由Ajax访问，则同名的Action方法要同时标识为非Ajax访问。
    /// </summary>
    public class CallByAjaxAttribute : ActionNameSelectorAttribute
    {
        /// <summary>
        /// 默认构造函数，IsAjax为true
        /// </summary>
        public CallByAjaxAttribute()
        {
            this.IsAjax = true;
        }
        public CallByAjaxAttribute(bool isAjax)
        {
            this.IsAjax = isAjax;
        }

        /// <summary>
        /// 首先我们需要一个属性来设置该Action是用于Ajax请求还是一般的请求
        /// </summary>
        public bool IsAjax
        {
            get;
            set;
        }

        public override bool IsValidName(ControllerContext controllerContext, string actionName, System.Reflection.MethodInfo methodInfo)
        {
            //如果是使用jQuery之类的JS框架来进行Ajax请求操作的话，可以使用下面的语句判断
            string xhr = controllerContext.HttpContext.Request.Headers["X-Requested-With"] ?? "";

            //如果是MicrosoftAjax来进行异步请求，它会在form中添加一个"__MVCASYNCPOST"的标识，我么可以使用该标识来进行判断
            string aspnetajax = controllerContext.HttpContext.Request.Form["__MVCASYNCPOST"] ?? "";

            //当然你也可以在发送AJAX请求的时候自己添加一个标识
            string isajax = controllerContext.HttpContext.Request.Headers["IsAjax"] ?? "";
            
            return !(IsAjax ^ (xhr.ToLower() == "xmlhttprequest" || isajax.ToLower() == "true" || aspnetajax.ToLower() == "true"));
        }
    }
}
